package com.bjsxt.base.sync003;

/**
 * 对象锁的同步和异步问题
 * @author alienware
 *
 */
public class MyObject {

	public synchronized void method1(){
		try {
			System.out.println(Thread.currentThread().getName());
			Thread.sleep(4000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	/**
	 * method2没有加上synchronized后，t2线程执行该方法时，不需要获得锁，就能执行
	 * method2加上synchronized后，t2线程需要获得锁才能执行
	 */
	/** synchronized */
	public void method2(){
			System.out.println(Thread.currentThread().getName());
	}

	/**
	 * 说明：
	 * 演示的是对象锁，如果该对象中的方法加了锁；线程1和线程2都用同一个对象调用这个方法，那么需要等到一个线程
	 * 方法执行完后（释放锁以后），才能到下一个线程执行这个方法
	 * --这里t1,t2都调用mo对象的method1、method2两个不同方法，如果这两个方法都加了锁，需要等待某个线程执行完
	 *
	 * @param args
	 */
	public static void main(String[] args) {
		
		final MyObject mo = new MyObject();
		
		/**
		 * 分析：
		 * t1线程先持有object对象的Lock锁，t2线程可以以异步的方式调用对象中的非synchronized修饰的方法
		 * t1线程先持有object对象的Lock锁，t2线程如果在这个时候调用对象中的同步（synchronized）方法则需等待，也就是同步（method2加上synchronized）
		 */

		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				mo.method1();
			}
		},"t1");
		
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				mo.method2();
			}
		},"t2");
		
		t1.start();
		t2.start();
		
	}
	
}
